home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / AGNUS / SRC / SYSINFO / GETCLOCK.SPP next >
Encoding:
Text File  |  1996-07-09  |  2.3 KB  |  100 lines

  1. ; 68030er Taktermittlung fuer Falcon, TT
  2. ; fuer alle Takte zwischen 8 und 50 MHz
  3. ; Autorin: Natalie Luebke 08.01.96
  4. ; Verbesserungen: Volker Hemsen 01.06.96
  5. ; FPU-Messungen: Volker Hemsen, 09.07.96
  6.  
  7. ANZDIVS        EQU    63
  8. CPU_BASE    EQU    16*125
  9. FPU_BASE    EQU    4706
  10. START        EQU    $FF
  11.  
  12. TADR    EQU    $FFFFFA1F
  13. TACR    EQU    $FFFFFA19
  14. IERA    EQU    $FFFFFA07
  15.  
  16.     TEXT
  17.     XDEF    _get_cpuclock,_get_fpuclock
  18. ; aus C heraus: extern short get_cpuclock(void);
  19. ; aus C heraus: extern short get_fpuclock(void);
  20. _get_cpuclock:    clr.w    tst_mode
  21.         bra    _get_clock
  22. _get_fpuclock:    move.w    #1,tst_mode
  23. _get_clock:    movem.l    d1-a6,-(sp)
  24.         pea    tst_clk(pc)
  25.         move.w    #$26,-(sp)
  26.         trap    #14
  27.         addq.l    #6,sp
  28.         movem.l    (sp)+,d1-a6
  29.         rts
  30.  
  31. tst_clk:    move.w    SR,old_sr    ;SR sichern
  32.         movec    CACR,d0        ;Cache-Einstellungen sichern
  33.         move.l    d0,old_cacr
  34.         move.b    (TADR).w,old_ta_dat    ;MFP-Reg sichern
  35.         move.b    (TACR).w,old_ta_con
  36.         ;move.b    (IERA).w,old_enable
  37.         and.b    #$DF,(IERA).w    ;Timer A IR sperren
  38.         ori.w    #$0700,SR    ;alle CPU-IRs sperren
  39.         moveq    #0,d2
  40.         moveq    #0,d1
  41.         moveq    #$0019,d0    ;Cache loeschen, burst & enable
  42.         movec    d0,CACR
  43. cacheloop:    move.b    #0,(TACR).w    ;Timer A stoppen
  44.         move.b    #START,(TADR).w    ;Startwert einsetzen
  45.         move.b    #1,(TACR).w    ;Timer starten
  46.         tst.w    tst_mode
  47.         bne.s    fpu_tstloop
  48. cpu_tstloop:    divu.w    #10,d0
  49.         dbra    d1,cpu_tstloop
  50.         bra    after_tstloop
  51. fpu_tstloop:    fdiv.x    #10,fp0
  52.         fdiv.x    #10,fp0
  53.         dbra    d1,fpu_tstloop
  54. after_tstloop:    clr.b    (TACR).w    ;Timer stoppen
  55.         moveq    #0,d0
  56.         move.b    (TADR).w,d0    ;Wert auslesen
  57.         tst.w    d2
  58.         bne    over
  59.         moveq    #1,d2
  60.         move.w    #ANZDIVS-1,d1
  61.         moveq    #0,d0
  62.         bra    cacheloop
  63. over:        move.b    old_ta_dat,(TADR).w    ;Reg. restaurieren
  64.         move.b    old_ta_con,(TACR).w
  65.         ;move.b    old_enable,(IERA).w
  66.         move.l    old_cacr,d1        ;Cache-Einstellungen zurueck
  67.         movec    d1,CACR
  68.         move.w    old_sr,d1    ;IR-Masken aus altem SR ...
  69.         andi.w    #$0700,d1
  70.         move.w    SR,d2        ;... wieder in jetziges ...
  71.         andi.w    #$F8FF,d2
  72.         or.w    d1,d2
  73.         move.w    d2,SR        ;... SR setzen
  74.         move.w    #START,d3    ;Takt ermitteln
  75.         sub.w    d0,d3
  76.         move.l    #CPU_BASE,d0
  77.         tst.w    tst_mode
  78.         beq.s    base_ok
  79.         move.l    #FPU_BASE,d0
  80. base_ok:    divu    d3,d0
  81.         swap    d0
  82.         move.w    d0,d1
  83.         clr.w    d0
  84.         swap    d0
  85.         lsr.w    #1,d3
  86.         cmp.w    d3,d1
  87.         blt    ok
  88.         addq.w    #1,d0
  89. ok:        rts
  90.  
  91.     DATA
  92. tst_mode:    dc.w    0
  93. old_sr:        dc.w    0
  94. old_cacr:    dc.w    0
  95.         dc.w    0
  96. old_ta_con:    dc.w    0
  97. old_ta_dat:    dc.w    0
  98. ;old_enable:    dc.w    0
  99.     END
  100.